import {
	checkStatus
} from './checkStatus';
import {
	useI18n
} from "@/locales/setupI18n";
import {
	isArray
} from "@/utils/is";

/** 初始化蓝牙模块
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export function openBluetoothAdapter(errorMessageMode = 'message') {
	const {
		t
	} = useI18n();
	return new Promise(async (resolve, reject) => {
		//#ifdef APP-PLUS || MP-WEIXIN
		uni.openBluetoothAdapter({ // 初始化蓝牙模块
			async success(res) {
				// console.log('openBluetoothAdapter_success', res);
				resolve(true);
			},
			fail(e) {
				// uni.showModal({
				// 	title: '打开蓝牙搜索失败',
				// 	content: '蓝牙初始化失败，请打开蓝牙'
				// });
				// console.log('openBluetoothAdapter_fail', e);
				checkStatus(e.errCode, t('bluetooth.bluetoothTurnonTip'), errorMessageMode);
				reject(e);
			}
		});
		//#endif
		// #ifndef APP-PLUS || MP-WEIXIN
		resolve(false);
		//#endif
	});
}

/** 获取本机蓝牙适配器状态
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export function getBluetoothAdapterState(errorMessageMode = 'message') {
	const {
		t
	} = useI18n();
	return new Promise(async (resolve, reject) => {
		//#ifdef APP-PLUS || MP-WEIXIN
		// // 初始化蓝牙模块
		// await openBluetoothAdapter('none');
		uni.getBluetoothAdapterState({ // 获取本机蓝牙适配器状态
			async success(res) {
				// console.log('getBluetoothAdapterState_success', res);
				resolve(res);
			},
			fail(e) {
				checkStatus(e.errCode, e.errMsg, errorMessageMode);
				reject(e);
			}
		});
		//#endif
		// #ifndef APP-PLUS || MP-WEIXIN
		resolve(null);
		//#endif
	});
}

/** 开始蓝牙搜索
 * @param callback 操作完成回调函数
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export async function startBluetoothSearch(callback, errorMessageMode = 'message') {
	const {
		t
	} = useI18n();
	let bleDevices = [];
	//#ifdef APP-PLUS || MP-WEIXIN
	// // 初始化蓝牙模块
	// await openBluetoothAdapter('none');
	// 停止蓝牙搜索
	await stopBluetoothSearch(errorMessageMode);
	// 开始搜寻附近的蓝牙外围设备。此操作比较耗费系统资源，请在搜索并连接到设备后调用 uni.stopBluetoothDevicesDiscovery 方法停止搜索。
	// services	Array<String>		否	要搜索但蓝牙设备主 service 的 uuid 列表。某些蓝牙设备会广播自己的主 service 的 uuid。如果设置此参数，则只搜索广播包有对应 uuid 的主服务的蓝牙设备。建议主要通过该参数过滤掉周边不需要处理的其他蓝牙设备。
	// allowDuplicatesKey	boolean	false	否	是否允许重复上报同一设备。如果允许重复上报，则 uni.onBlueToothDeviceFound 方法会多次上报同一设备，但是 RSSI 值会有不同。
	// interval	number	0	否	上报设备的间隔。0 表示找到新设备立即上报，其他数值根据传入的间隔上报。
	// success	function		否	接口调用成功的回调函数
	// fail	function		否	接口调用失败的回调函数
	// complete	function		否	接口调用结束的回调函数（调用成功、失败都会执行）
	uni.startBluetoothDevicesDiscovery({
		success: (res) => {
			// console.log('startBluetoothDevicesDiscovery_success', res);
			// 监听搜索到新设备的事件
			uni.onBluetoothDeviceFound((result) => {
				// plus.bluetooth.onBluetoothDeviceFound((result) => {
				// console.log('onBluetoothDeviceFound', result);
				let arr = bleDevices;
				let devices = [];
				let list = result.devices;
				// name: (String 类型 )蓝牙设备名称 某些设备可能没有此字段值。
				// deviceId: (String 类型 )蓝牙设备的id
				// RSSI: (Number 类型 )蓝牙设备的信号强度
				// advertisData: (ArrayBuffer 类型 )蓝牙设备的广播数据段中的ManufacturerData数据段
				// advertisServiceUUIDs: (Array[String] 类型 )蓝牙设备的广播数据段中的ServiceUUIDs数据段
				// localName: (String 类型 )蓝牙设备的广播数据段中的LocalName数据段
				// serviceData: (JSON 类型 )蓝牙设备的广播数据段中的ServiceData数据段
				for (let i = 0; i < list.length; ++i) {
					let bleDevice = list[i];
					if (bleDevice.name && bleDevice.name !== "未知设备") {
						// if (bleDevice.name === undefined || bleDevice.name === null ||
						// 	bleDevice.name === '') {
						// 	bleDevice.name = t('bluetooth.noneDeviceNameText');
						// }
						let arrNew = arr.filter((item) => {
							return item.deviceId == bleDevice.deviceId;
						});
						// console.log('arrNew:',arrNew.length)
						if (arrNew.length == 0) {
							devices.push(bleDevice);
						}
					}

				}
				bleDevices = arr.concat(devices);
				if (typeof callback === 'function') {
					callback(bleDevices)
				}
			});
			let time = setTimeout(() => {
				// 获取已搜索到的蓝牙设备
				uni.getBluetoothDevices({
					// plus.bluetooth.getBluetoothDevices({
					success(res2) {
						let devices = [];
						let list = res2.devices;
						for (let i = 0; i < list.length; ++i) {
							let bleDevice = list[i];
							if (bleDevice.name && bleDevice.name !== "未知设备") {
								// if (bleDevice.name === undefined || bleDevice.name === null ||
								// 	bleDevice.name === '') {
								// 	bleDevice.name = t('bluetooth.noneDeviceNameText');
								// }
								devices.push(bleDevice);
							}
						}
						bleDevices = devices;
						// console.log('getBluetoothDevices:', res2);
						if (typeof callback === 'function') {
							callback(bleDevices)
						}
					},
				})

				clearTimeout(time);
			}, 3000);
		},
		fail: (e) => {
			// console.log('startBluetoothDevicesDiscovery_fail', e);
			checkStatus(e.errCode, e.errMsg, errorMessageMode);
		}
	});
	//#endif
	// #ifndef APP-PLUS || MP-WEIXIN
	if (typeof callback === 'function') {
		callback(bleDevices)
	}
	//#endif
}

/** 停止蓝牙搜索
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export async function stopBluetoothSearch(errorMessageMode = 'message') {
	// const {
	// 	t
	// } = useI18n();
	//#ifdef APP-PLUS || MP-WEIXIN
	// // 初始化蓝牙模块
	// await openBluetoothAdapter('none');
	const bleAdapterState = await getBluetoothAdapterState(errorMessageMode);
	if (bleAdapterState.available) {
		if (bleAdapterState.discovering) {
			return new Promise((resolve, reject) => {
				uni.stopBluetoothDevicesDiscovery({ // 停止搜寻附近的蓝牙外围设备。若已经找到需要的蓝牙设备并不需要继续搜索时，建议调用该接口停止蓝牙搜索。
					success: (res) => {
						// console.log('stopBluetoothDevicesDiscovery_success', res);
						resolve(true);
					},
					fail: (e) => {
						// uni.showModal({
						// 	title: '关闭蓝牙搜索失败',
						// 	content: JSON.stringify(e)
						// });
						// console.log('stopBluetoothDevicesDiscovery_fail', e);
						checkStatus(e.errCode, e.errMsg, errorMessageMode);
						reject(e);
					}
				});
			});
		} else {
			return true;
		}
	} else {
		checkStatus(undefined, t('bluetooth.bluetoothNotAvailableTip'), errorMessageMode);
		return false;
	}
	//#endif
	// #ifndef APP-PLUS || MP-WEIXIN
	return true;
	//#endif
}

/** 绑定蓝牙设备
 * @param deviceId 蓝牙设备的id
 * @param timeout 超时时间 单位为ms（毫秒），不设置此属性表示不会超时。
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export function bindBluetoothDevice(deviceId, timeout = null, errorMessageMode = 'message') {
	// const {
	// 	t
	// } = useI18n();
	return new Promise(async (resolve, reject) => {
		//#ifdef APP-PLUS || MP-WEIXIN
		// // 初始化蓝牙模块
		// await openBluetoothAdapter('none');
		// 连接低功耗蓝牙设备	(若之前已有搜索过某个蓝牙设备，并成功建立连接，可直接传入之前搜索获取的deviceId尝试连接该设备，无需进行搜索操作。)
		// deviceId: ( String ) 必选 蓝牙设备的id
		// timeout: ( Number ) 可选 超时时间 单位为ms（毫秒），不设置此属性表示不会超时。
		// success: ( BluetoothSuccessCallback ) 可选 连接成功回调函数
		// fail: ( BluetoothFailCallback ) 可选 连接失败回调函数
		// complete: ( BluetoothCompleteCallback ) 可选 连接操作完成回调函数 调用成功或失败都会触发此回调。
		uni.createBLEConnection({
			// plus.bluetooth.createBLEConnection({
			deviceId: deviceId,
			timeout: timeout,
			success(res) {
				// console.log('createBLEConnection_success', res);
				// uni.showModal({
				// 	title: '绑定蓝牙设备成功',
				// 	content: JSON.stringify(res)
				// });
				resolve(true);
			},
			fail(e) {
				// console.log('createBLEConnection_fail', e);
				checkStatus(e.errCode, e.errMsg, errorMessageMode);
				reject(e);
			}
		});
		//#endif
		// #ifndef APP-PLUS || MP-WEIXIN
		resolve(false);
		//#endif
	});
}

/** 获取蓝牙设备的所有服务(service)
 * @param deviceId 蓝牙设备的id
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export function getBluetoothSevices(deviceId, errorMessageMode = 'message') {
	// const {
	// 	t
	// } = useI18n();
	return new Promise(async (resolve, reject) => {
		//#ifdef APP-PLUS || MP-WEIXIN
		// // 初始化蓝牙模块
		// await openBluetoothAdapter('none');
		// deviceId: ( String ) 必选 蓝牙设备的id
		// success: ( BluetoothSuccessCallback ) 可选 获取服务成功回调函数 回调函数参数event对象包括以下属性： services - Array>BluetoothService<类型，蓝牙设备服务的特征值列表。
		// fail: ( BluetoothFailCallback ) 可选 获取服务失败回调函数
		// complete: ( BluetoothCompleteCallback ) 可选 获取服务操作完成回调函数 调用成功或失败都会触发此回调。
		// uni.getBLEDeviceServices({
		// 	// plus.bluetooth.getBLEDeviceServices({
		// 	deviceId: deviceId,
		// 	success(res) {
		// 		// console.log('getBLEDeviceServices_success', res);
		// 		// uni.showModal({
		// 		// 	title: '获取蓝牙设备服务成功',
		// 		// 	content: JSON.stringify(res)
		// 		// });
		// 		const services = res.services;
		// 		resolve(services);
		// 	},
		// 	fail: function(e) {
		// 		// console.log('getBLEDeviceServices_fail', e);
		// 		checkStatus(e.errCode, e.errMsg, errorMessageMode);
		// 		reject(e);
		// 	}
		// });
		let time = setTimeout(() => {
			// deviceId: ( String ) 必选 蓝牙设备的id
			// success: ( BluetoothSuccessCallback ) 可选 获取服务成功回调函数 回调函数参数event对象包括以下属性： services - Array>BluetoothService<类型，蓝牙设备服务的特征值列表。
			// fail: ( BluetoothFailCallback ) 可选 获取服务失败回调函数
			// complete: ( BluetoothCompleteCallback ) 可选 获取服务操作完成回调函数 调用成功或失败都会触发此回调。
			uni.getBLEDeviceServices({
			// plus.bluetooth.getBLEDeviceServices({
				deviceId: deviceId,
				success(res) {
					// console.log('getBLEDeviceServices_success', res);
					// uni.showModal({
					// 	title: '获取蓝牙设备服务成功',
					// 	content: JSON.stringify(res)
					// });
					const services = res.services;
					resolve(services);
				},
				fail: function(e) {
					// console.log('getBLEDeviceServices_fail', e);
					checkStatus(e.errCode, e.errMsg, errorMessageMode);
					reject(e);
				}
			});
			clearTimeout(time);
		}, 2000);
		//#endif
		//#ifndef APP-PLUS || MP-WEIXIN
		resolve(null);
		//#endif
	});
}

/** 获取蓝牙设备指定服务中所有特征值(characteristic)
 * @param deviceId 蓝牙设备的id
 * @param serviceId 蓝牙服务 uuid 可通过getBLEDeviceServices获取。
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export function getBluetoothCharacteristics(deviceId, serviceId, errorMessageMode = 'message') {
	// const {
	// 	t
	// } = useI18n();
	return new Promise(async (resolve, reject) => {
		//#ifdef APP-PLUS || MP-WEIXIN
		// // 初始化蓝牙模块
		// await openBluetoothAdapter('none');
		// 获取蓝牙设备指定服务中所有特征值(characteristic)
		// deviceId: ( String ) 必选 蓝牙设备的id
		// serviceId: ( String ) 必选 蓝牙服务 uuid 可通过getBLEDeviceServices获取。
		// success: ( BluetoothSuccessCallback ) 可选 获取特征值成功回调函数 回调函数参数event对象包括以下属性： characteristics - Array>Bluetoothcharacteristic<类型，蓝牙设备服务的特征值列表。
		// fail: ( BluetoothFailCallback ) 可选 获取特征值失败回调函数
		// complete: ( BluetoothCompleteCallback ) 可选 获取特征值操作完成回调函数 调用成功或失败都会触发此回调。
		uni.getBLEDeviceCharacteristics({
			// plus.bluetooth.getBLEDeviceCharacteristics({
			deviceId: deviceId,
			serviceId: serviceId,
			success(res) {
				// console.log('getBLEDeviceCharacteristics_success', res);
				// uni.showModal({
				// 	title: '获取蓝牙设备特征值成功',
				// 	content: JSON.stringify(res)
				// });
				let bleCharacteristics = [];
				for (let i = 0; i < res.characteristics.length; ++i) {
					const uuid = res.characteristics[i].uuid;
					const properties = res.characteristics[i].properties;

					let bleCharacteristic = {
						DeviceId: deviceId,
						ServiceId: serviceId,
						CharaterId: uuid,
						Read: properties.read,
						Write: properties.write,
						Notify: properties.notify,
						Indicate: properties.indicate,
					};

					bleCharacteristics.push(bleCharacteristic);
				}
				resolve(bleCharacteristics);
			},
			fail: function(e) {
				// console.log('getBLEDeviceCharacteristics_fail', e);
				checkStatus(e.errCode, e.errMsg, errorMessageMode);
				reject(e);
			}
		});
		//#endif
		// #ifndef APP-PLUS || MP-WEIXIN
		resolve(null);
		//#endif
	});
}

/** 获取蓝牙设备的所有服务的所有特征值(characteristic)
 * @param deviceId 蓝牙设备的id
 * @param services [{uuid: '蓝牙设备服务的 uuid', isPrimary: '该服务是否为主服务' }] 设备服务列表 可通过getBLEDeviceServices获取
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export function getBluetoothCharacteristicsByServices(deviceId, services, errorMessageMode = 'message') {
	// const {
	// 	t
	// } = useI18n();
	return new Promise(async (resolve, reject) => {
		//#ifdef APP-PLUS || MP-WEIXIN
		// // 初始化蓝牙模块
		// await openBluetoothAdapter('none');
		let bleCharacteristics = [];
		if (!isArray(services)) {
			services = [services];
		}
		if (isArray(services) && services.length > 0) {
			for (let i = 0; i < services.length; ++i) {
				const service = services[i];
				const bleCharacteristic = await getBluetoothCharacteristics(deviceId, service.uuid,
					errorMessageMode);
				if (bleCharacteristic) {
					// bleCharacteristics.push(bleCharacteristic);
					bleCharacteristics = [...bleCharacteristics, ...bleCharacteristic]
				}
			}
			resolve(bleCharacteristics);
		}
		//#endif
		// #ifndef APP-PLUS || MP-WEIXIN
		resolve(null);
		//#endif
	});
}

/** 释放蓝牙设备
 * @param deviceId 蓝牙设备的id
 * @param errorMessageMode 错误消息提示模式: 'none' | 'modal' | 'message'
 */
export function releaseBluetoothDevice(deviceId, errorMessageMode = 'message') {
	// const {
	// 	t
	// } = useI18n();
	return new Promise(async (resolve, reject) => {
		//#ifdef APP-PLUS || MP-WEIXIN
		// // 初始化蓝牙模块
		// await openBluetoothAdapter('none');
		// 断开与低功耗蓝牙设备的连接
		// deviceId: ( String ) 必选 蓝牙设备的id
		// success: ( BluetoothSuccessCallback ) 可选 连接成功回调函数
		// fail: ( BluetoothFailCallback ) 可选 连接失败回调函数
		// complete: ( BluetoothCompleteCallback ) 可选 连接操作完成回调函数 调用成功或失败都会触发此回调。
		uni.closeBLEConnection({
			// plus.bluetooth.closeBLEConnection({
			deviceId: deviceId,
			success(res) {
				// console.log('closeBLEConnection_success', res);
				// uni.showModal({
				// 	title: '断开蓝牙设备成功',
				// 	content: JSON.stringify(res)
				// });
				resolve(true);
			},
			fail(e) {
				// console.log('closeBLEConnection_fail', e);
				checkStatus(e.errCode, e.errMsg, errorMessageMode);
				reject(e);
			}
		});
		//#endif
		// #ifndef APP-PLUS || MP-WEIXIN
		resolve(true);
		//#endif
	});
}

/** 监听低功耗蓝牙连接状态的改变
 * @param callback 回调函数
 */
export function onBluetoothDeviceState(callback) {
	//#ifdef APP-PLUS || MP-WEIXIN
	uni.onBLEConnectionStateChange(async function(res) {
		// plus.bluetooth.onBLEConnectionStateChange(function (res) {
		// 该方法回调中可以用于处理连接意外断开等异常情况
		// console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`);
		// res.deviceId	string	蓝牙设备ID
		// res.connected	boolean	是否处于已连接状态
		if (typeof callback === 'function') {
			await callback(res);
		}
	});
	//#endif
	// #ifndef APP-PLUS || MP-WEIXIN
	//#endif
}
